/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Parser.Validador;

import Utilidades.*;
import javax.swing.JOptionPane;

/**
 *
 * @author Administrador
 */
public class ValidadorPrologo implements IValidador {


    private static String nombres[]={"version", "encoding", "standalone"};
    private static String versiones[]={"1.0", "1.1"};
    private static String encoding[]={"US-ASCII", "UTF-7", "UTF-8", "UCS-2", "EUC-JP",
    "Shift_JIS", "Big5", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4",
    "ISO-8859-5", "ISO-8859-6", "ISO-8859-7"};
    private static String standalone[]={"yes","no"};
    public static String error = "";

    /**
     * Valida que los atributos del Prologo sean correctos
     * @param vectorAtributos Vector de atributos de la etiqueta que representa el prologo
     */
    public static boolean validarAtributos(AtributoEtiqueta[] vectorAtributos) {
        boolean correcto=false;
        switch (vectorAtributos.length){
            case 1:
                correcto=validarVersion(vectorAtributos[0]);
                break;
            case 2:
                if(vectorAtributos[1].getNombre().equals(nombres[1])){//Es encoding
                    correcto=validarVersion(vectorAtributos[0]) && validarEncoding(vectorAtributos[1]);
                    break;
                }else if(vectorAtributos[1].getNombre().equals(nombres[2])){//Es standalone
                    correcto=validarVersion(vectorAtributos[0]) && validarStandalone(vectorAtributos[1]);
                    break;
                }else{
                    error="El segundo atributo del prologo debe ser encoding o standalone";
                    break;
                }
            case 3:
                correcto=validarVersion(vectorAtributos[0]) && validarEncoding(vectorAtributos[1]) && validarStandalone(vectorAtributos[2]);
                if(!correcto)
                    error="Los atributos del prologo deben ser version, encoding y standalone";
                break;
            default:
                error="El prologo debe tener entre 1 y 3 atributos.";
                break;
        }

        if(!correcto)
            JOptionPane.showMessageDialog(null, error, "ERROR!", JOptionPane.ERROR_MESSAGE);

        return correcto;
    }

    private static boolean validarVersion(AtributoEtiqueta atri) {
        error="El valor de Version del prologo es invalido";
        if(atri.getNombre().equals(nombres[0])){
            for(int i=0; i<versiones.length; i++){
                if(atri.getValor().equals(versiones[i]))
                    return true;
            }
        }else{
            error="El primer atributo del prologo debe ser version";
        }
        return false;
    }

    private static boolean validarEncoding(AtributoEtiqueta atri) {
        error="El valor de Encoding en el prologo es invalido";
        for(int i=0; i<encoding.length; i++){
            if(atri.getValor().equals(encoding[i]))
                return true;
        }
        return false;
    }

    private static boolean validarStandalone(AtributoEtiqueta atri) {
        error="El valor de Standalone en el prologo es invalido";
        for(int i=0; i<standalone.length; i++){
            if(atri.getValor().equals(standalone[i]))
                return true;
        }
        return false;
    }

    private String str;
    private ValidadorVariables vVariables;

    /**
     * Construtor que crea un validador variables para el prologo
     */
    public ValidadorPrologo() {
        this.vVariables = new ValidadorVariables();
    }

    public boolean validar(String str) {
        boolean resultado = true;
        this.vVariables.clear();

        try {
            this.str = str;

            if (VerificadorStrings.esInicioFin(str, "<?xml", "?>") == false) {
                resultado = false;
            }
            else if (Balance.esBalanceada(str, '"', '"') == false) {
                resultado = false;
            }
            else if (VerificadorStrings.tieneMasDe(str, "<", 1,true) == true) {
                resultado = false;
            }
            else if (VerificadorStrings.tieneMasDe(str, ">", 1,true) == true) {
                resultado = false;
            }
            else if (VerificadorStrings.tieneMasDe(str, "?", 2,true) == true) {
                resultado = false;
            }
            else if (VerificadorStrings.tieneMasDe(str, "-", 0,true) == true) {
                resultado = false;
            }
            else if (VerificadorStrings.tieneMasDe(str, "!", 0,true) == true) {
                resultado = false;
            }
            else if (VerificadorStrings.tieneMasDe(str, "/", 0,true) == true) { //el prologo no se cierra
                resultado = false;
            }
            else if (this.variablesOK() == false) {
                resultado = false;
            }
            else if (VerificadorStrings.validarNombreTag(str, "<?xml", "?>") == true) {
                resultado = false;
            }

          

        } catch (Exception e) {
            resultado = false;
        } finally {
            return resultado;
        }
    }

    private boolean variablesOK() {
        boolean resultado = true;
        String[] array = StrOp.separar(str, " ", "<?xml", "?>", '"', '"');

        for (int i = 0; i < array.length; i++) {
            String sAux = array[i];
            if (sAux != null && sAux.equals("") == false) {
                boolean bAux = this.vVariables.validar(sAux);
                if (bAux == false) {
                    resultado = false;
                    break;
                }
            }
        }
        return resultado;
    }

}
